Batch Normalization

Note

同正则化、Dropout一样,Batch Normalization(BN)也是一种处理深度神经网络过拟合的方法
Batch Normalization可以加速网络收敛,让我们能够训练更深的网络

Intuition

回想第一节我们用线性回归预测Boston房价时,第一步是标准化输入特征,类似地,神经网络也需要标准化输入特征,其实不仅是输入层,中间各层也需要标准化

此外更深层的网络非常复杂容易过拟合,这就有正则的需求

Batch Normalization其实就是按批进行标准化,再统一拉伸和偏移:

\[\mathrm{BN}(\mathbf{x}) = \boldsymbol{\gamma}\odot\frac{\mathbf{x} - \hat{\boldsymbol{\mu}}_{\mathcal{B}}}{\hat{\boldsymbol{\sigma}}_{\mathcal{B}}} + \boldsymbol{\beta}\]

其中 \(\hat{\boldsymbol{\mu}}_{\mathcal{B}}\)\(\hat{\boldsymbol{\sigma}}_{\mathcal{B}}\) 分别是小批量 \(\mathcal{B}\) 的均值和标准差;拉伸参数 \(\boldsymbol{\gamma}\) 和偏移参数 \(\boldsymbol{\beta}\)\(\mathbf{x}\) 的形状相同,是模型需要学习的参数。

均值和标准差的计算公式如下:

\[\hat{\boldsymbol{\mu}}_{\mathcal{B}} = \frac{1}{|\mathcal{B}|}\sum_{x\in{\mathcal{B}}}\mathbf{x}\]
\[\hat{\boldsymbol{\sigma}}_{\mathcal{B}}^{2} = \frac{1}{|\mathcal{B}|}\sum_{x\in{\mathcal{B}}}(\mathbf{x} - \hat{\boldsymbol{\mu}}_{\mathcal{B}})^{2} + \boldsymbol{\epsilon}\]

Pytorch中的Batch Normalization

from torch import nn

net = nn.Sequential(
    # BN一般在全连接层之后,激活函数之前,需指定输入的维度
    # CNN也有其对应的BN层即BatchNorm2d,后面会讲
    nn.Linear(784, 100), nn.BatchNorm1d(100), nn.ReLU(),
    nn.Linear(100, 64), nn.BatchNorm1d(64), nn.ReLU(),
    nn.Linear(64, 10))

Warning

Batch Normalization和Dropout一起使用的话 1+1 < 1,所以不要一起使用,二者选其一就行
Batch Normalization也有正则的效果,所以一般不和正则化一起使用